<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    class Obj{
      constructor() {
        this.name = 'qdew'
      }
    }
    Obj.prototype.age = 11
    Obj.prototype.sayName = function(){
      console.log(this.str)
    }
    let obj = {
      num:1,
      str:"aaa",
      arr:[1,2],
      o:{
        a:11,
        b:"bb"
      },
      fun: function(){
        console.log('objfun')
      },
    }
    let arr = [
      {a:"aa"},1,2,3,'bb'
    ]
    obj = new Obj()

    // 深拷贝
    // 1、JSON转换（缺点：不能复制 函数 ，不能拷贝原型链上的方法和属性）
    // let targetObj = JSON.parse(JSON.stringify(obj))
    // console.log(targetObj)
    // let targetArr = JSON.parse(JSON.stringify(arr))
    // console.log(targetArr)

    // 2、循环递归
    function deepCopy(obj){
      // 不是 对象类型 则原样返回
      if((typeof obj) !== "object" || obj === null){
        return obj
      }
      let target = Array.isArray(obj) ? [] : {}
      
      // for (const key in obj) {          // for in 会遍历原型链
      for (const key of Object.keys(obj)) {
        if((typeof obj[key]) !== "object" || obj[key] === null){
          target[key] = obj[key]
        }else{
          target[key] = deepCopy(obj[key])
        }
      }
      return target
    }
    let deepTarget = deepCopy(obj)
    console.log(deepTarget)
  </script>
</body>
</html>